package com.szwistar.common.comm;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.buffer.IoBufferWrapper;

/**
 * 自己定义的 IoBuffer 扩展
 * 方便读写切换和数据长度判断
 */
public class IoBufferEx extends IoBufferWrapper {
	public IoBufferEx(IoBuffer buf) {
		super(buf);
	}

	/**
	 * 是否是写模式
	 */
	boolean forWrite() {
		return (limit() == capacity());
	}

	/**
	 * 设置为写模式
	 */
	IoBufferEx setForWrite() {
		if(!forWrite()) {
			position(limit());
			limit(capacity());
		}
		return this;
	}

	/**
	 * 是否是读模式
	 */
	boolean forRead() {
		return !forWrite();
	}

	/**
	 * 设置为读模式
	 */
	IoBufferEx setForRead() {
		if(forWrite()) {
			limit(position());
			position(0);
		}
		return this;
	}

	/**
	 * 未读的数据长度
	 */
	int unreading() {
		if(forWrite()) {
			return position();
		} else {
			return limit()-position();
		}
	}

	/**
	 * 剩余的空间
	 */
	int freeing() {
		if(forWrite()) {
			return limit()-position();
		} else {
			return capacity()-limit();
		}
	}

	/**
	 * 从尾部删除一些数据
	 * @param size 要删除的数据长度(实际删除长度不大于实际未读的长度)
	 * @return 自己
	 */
	IoBufferEx unput(int size) {
		if(forWrite()) {
			if(position() > size) {
				position(position()-size);
			} else {
				position(0);
			}
		} else {
			if((limit()-position()) > size) {
				limit(limit()-size);
			} else {
				limit(position());
			}
		}

		return this;
	}
}
